#ifndef LOGGER_H
#define LOGGER_H

#include "NoCopy.h"

#include <pthread.h>
#include <log4cpp/Category.hh>

//拼接msg
#define  MSG(msg) std::string("[").append(__FILE__).append(":")\
         .append(__func__).append(":").append(std::to_string(__LINE__))\
         .append("]").append(msg).c_str()

#define LogInfo(msg) l::Logger::getInstance()->info(MSG(msg))
#define LogError(msg) l::Logger::getInstance()->error(MSG(msg))
#define LogWarn(msg) l::Logger::getInstance()->warn(MSG(msg)) 
#define LogDebug(msg) l::Logger::getInstance()->debug(MSG(msg))

//log4cpp单例模式
namespace l
{
    class Logger
        :public NoCopy
    {

    public:

        static Logger* getInstance();

        void warn(const char* msg);

        void error(const char* msg);

        void debug(const char* msg);

        void info(const char* msg);

    private:

        //私有构造函数和析构函数
        Logger();

        ~Logger();

        static void destroy();

        static void initRoutine();

    private:
        //私有记录器
        log4cpp::Category& m_category;
        static pthread_once_t ms_onceControl;
        static Logger* ms_instance;

    };//end of class Logger;

}//end of namespace l


#endif
